#ifndef ____Outcome__
#define ____Outcome__

/*!
 * \file Outcome.h
 * \brief Déclaration des méthodes sur les Outcomes
 * \author AMMAR Inès (Responsable), CARBONNEL Jessie (Relecture)
 * \version 1.0
 * \date 01 mars 2013
 */
 
#include <iostream>
#include <string>
#include <vector>
#include "Variable.h"

/*!
 * \class Outcome
 * \brief Classe sur les outcomes (solutions).
*/ 
class Outcome{
    
private :
    std::vector<std::string> values; /*!< Vecteur de string !*/
    
public :
	
	/*!
	 * \fn Outcome()
	 * \brief Constructeur par défaut d'une Outcome.
	 * \return Renvoie une Outcome par défaut.
	 */	
    Outcome();
	
	/*!
	 * \fn Outcome(int nb,...)
	 * \brief Constructeur paramétré d'une Outcome.
	 * \param nb le nombre de valeurs de l'Outcome.
	 * \return Renvoie une Outcome paramétré entre autre par le nombre de ses valeurs ainsi que les valeurs des variables.
	 */	
    Outcome(int nb,...);
	
	/*!
	 * \fn addValue(string val)
	 * \brief Permet d'ajouter une valeur à l'Outcome.
	 * \param val le nom d'une valeur.
	 * \return Ne renvoie rien.
	 */	
    void addValue(std::string val);
	
	/*!
	 * \fn vector<string> getValues()
	 * \brief Permet d'obtenir l'ensemble des valeurs de l'Outcome.
	 * \return Renvoie l'ensemble des valeurs de l'Outcome.
	 */	
    std::vector<std::string> getValues()const;
	
	/*!
	 * \fn string getValues(int i)const
	 * \brief Permet d'obtenir la ième valeur de l'Outcome.
	 * \return Renvoie la ième valeur de l'Outcome.
	 */	
	std::string getValue(int) const;
	
	/*!
	 * \fn int getNumberOfValues()
	 * \brief Permet d'obtenir le nombre de valeurs dans l'Outcome.
	 * \return Renvoie le nombre de valeurs dans l'Outcome.
	 */	
	int getNumberOfValues()const;
	
	/*!
	 * \fn bool isPresent(string val)
	 * \brief Permet de savoir si une valeur est présente ou non dans l'Outcome.
	 * \param val le nom d'une valeur dont on cherche la présence dans l'Outcome.
	 * \return Renvoie Vrai si la valeur passée en paramètre est présente dans l'Outcome, Faux sinon.
	 */	
    bool isPresent(std::string val)const; 

	/*!
	 * \fn bool valide(string v)
	 * \brief Permet de savoir si une valeur valide l'Outcome.
	 * \param v le nom d'une valeur.
	 * \return Renvoie Vrai si la valeur passée en paramètre valide l'Outcome, Faux sinon.
	 */	
    bool valide(std::string v)const; 

	/*!
	 * \fn bool valide(string v1,string v2)
	 * \brief Permet de savoir si deux valeurs valident l'Outcome.
	 * \param v1 le nom d'une première valeur.
	 * \param v2 le nom d'une seconde valeur.
	 * \return Renvoie Vrai si les valeurs passées en paramètre valident l'Outcome, Faux sinon.
	 */	
    bool valide(std::string v1, std::string v2)const; 
	
	/*!
	 * \fn bool operator==(Outcome a)
	 * \brief Permet de savoir si deux Outcomes sont égales.
	 * \param a une instance de la classe Outcome.
	 * \return Renvoie Vrai si deux Outcomes sont égales, Faux sinon.
	 */	
   bool operator==(const Outcome& a)const; 
	
	/*!
	 * \fn void show()
	 * \brief Permet d'afficher les informations de l'Outcome.
	 * \return Ne renvoie rien.
	 */	
    void show()const;


};

#endif /* defined(____Outcome__) */
